﻿2026-05-10T11:59:35.7081574Z ##[group]Run pnpm verify:phase-4
2026-05-10T11:59:35.7081892Z [36;1mpnpm verify:phase-4[0m
2026-05-10T11:59:35.7103078Z shell: /usr/bin/bash -e {0}
2026-05-10T11:59:35.7103331Z env:
2026-05-10T11:59:35.7103889Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-10T11:59:35.7104431Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-10T11:59:35.7104663Z   SKIP_TRACE_CHECK: 1
2026-05-10T11:59:35.7104878Z ##[endgroup]
2026-05-10T11:59:36.0188710Z 
2026-05-10T11:59:36.0189733Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-10T11:59:36.0190688Z > node scripts/verify-phase-4.mjs
2026-05-10T11:59:36.0191155Z 
2026-05-10T11:59:36.0513952Z 
2026-05-10T11:59:36.0514575Z === Workspace: typecheck ===
2026-05-10T11:59:36.0515159Z >>> pnpm -r typecheck
2026-05-10T11:59:36.3942581Z Scope: 5 of 6 workspace projects
2026-05-10T11:59:36.4000003Z packages/db typecheck$ tsc --noEmit
2026-05-10T11:59:36.4009451Z packages/game-logic typecheck$ tsc --noEmit
2026-05-10T11:59:38.8079187Z packages/game-logic typecheck: Done
2026-05-10T11:59:38.8144273Z packages/protocol typecheck$ tsc --noEmit
2026-05-10T11:59:41.3482179Z packages/db typecheck: Done
2026-05-10T11:59:42.5090165Z packages/protocol typecheck: Done
2026-05-10T11:59:42.5104625Z apps/client typecheck$ tsc --noEmit
2026-05-10T11:59:42.5114910Z apps/server typecheck$ tsc --noEmit
2026-05-10T11:59:53.5714756Z apps/client typecheck: Done
2026-05-10T11:59:54.5151068Z apps/server typecheck: Done
2026-05-10T11:59:54.5254206Z 
2026-05-10T11:59:54.5254832Z === Lint: protocol-sync ===
2026-05-10T11:59:54.5255544Z >>> pnpm lint:protocol-sync
2026-05-10T11:59:54.8281441Z 
2026-05-10T11:59:54.8282524Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-10T11:59:54.8284209Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-10T11:59:54.8284891Z 
2026-05-10T11:59:54.8583979Z lint-protocol-sync: OK
2026-05-10T11:59:54.8704487Z 
2026-05-10T11:59:54.8705108Z === Lint: game-logic-purity ===
2026-05-10T11:59:54.8705978Z >>> pnpm lint:game-logic-purity
2026-05-10T11:59:55.1734287Z 
2026-05-10T11:59:55.1735391Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-10T11:59:55.1736459Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-10T11:59:55.1737103Z 
2026-05-10T11:59:55.2032590Z lint-game-logic-purity: OK (6 file(s) clean)
2026-05-10T11:59:55.2160853Z 
2026-05-10T11:59:55.2161487Z === Lint: better-auth-schema-sync ===
2026-05-10T11:59:55.2162415Z >>> pnpm lint:better-auth-schema-sync
2026-05-10T11:59:55.5570416Z 
2026-05-10T11:59:55.5571522Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-10T11:59:55.5572872Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-10T11:59:55.5573848Z 
2026-05-10T11:59:57.2299513Z lint-better-auth-schema-sync: OK
2026-05-10T11:59:57.2430781Z 
2026-05-10T11:59:57.2431299Z === Lint: rate-limit-budgets ===
2026-05-10T11:59:57.2434722Z >>> pnpm lint:rate-limit-budgets
2026-05-10T11:59:57.5515935Z 
2026-05-10T11:59:57.5516988Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-10T11:59:57.5518306Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-10T11:59:57.5518992Z 
2026-05-10T11:59:57.5831816Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-10T11:59:57.5949267Z 
2026-05-10T11:59:57.5949972Z === Lint: no-clipboard-rce ===
2026-05-10T11:59:57.5950795Z >>> pnpm lint:no-clipboard-rce
2026-05-10T11:59:57.9011063Z 
2026-05-10T11:59:57.9012133Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-10T11:59:57.9013689Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-10T11:59:57.9014312Z 
2026-05-10T11:59:57.9355878Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-10T11:59:57.9475132Z 
2026-05-10T11:59:57.9475656Z === Lint: room-layout ===
2026-05-10T11:59:57.9476562Z >>> pnpm lint:room-layout
2026-05-10T11:59:58.2517420Z 
2026-05-10T11:59:58.2518416Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-10T11:59:58.2519514Z > node tools/scripts/lint-room-layout.mjs
2026-05-10T11:59:58.2520604Z 
2026-05-10T11:59:58.2860796Z lint-room-layout: OK
2026-05-10T11:59:58.2986401Z 
2026-05-10T11:59:58.2988740Z === ADR 0004 lint ===
2026-05-10T11:59:58.2989417Z >>> pnpm lint:adr:0004
2026-05-10T11:59:58.6011795Z 
2026-05-10T11:59:58.6012783Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-10T11:59:58.6015221Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-10T11:59:58.6016231Z 
2026-05-10T11:59:58.6305589Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T11:59:58.6424302Z 
2026-05-10T11:59:58.6424807Z === Drizzle: emit-check ===
2026-05-10T11:59:58.6425558Z >>> pnpm db:emit-check
2026-05-10T11:59:58.9441578Z 
2026-05-10T11:59:58.9442561Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-10T11:59:58.9445966Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-10T11:59:58.9448218Z 
2026-05-10T11:59:59.3930558Z No config path provided, using default 'drizzle.config.ts'
2026-05-10T11:59:59.3945045Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-10T11:59:59.8145547Z 8 tables
2026-05-10T11:59:59.8146331Z accounts 8 columns 1 indexes 0 fks
2026-05-10T11:59:59.8147343Z audit_log 6 columns 0 indexes 2 fks
2026-05-10T11:59:59.8148297Z characters 9 columns 0 indexes 1 fks
2026-05-10T11:59:59.8151493Z inventory_items 4 columns 0 indexes 1 fks
2026-05-10T11:59:59.8152517Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-10T11:59:59.8153863Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-10T11:59:59.8155542Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-10T11:59:59.8156362Z sessions 5 columns 0 indexes 1 fks
2026-05-10T11:59:59.8156936Z 
2026-05-10T11:59:59.8157800Z No schema changes, nothing to migrate 😴
2026-05-10T11:59:59.9900414Z 
2026-05-10T11:59:59.9901159Z === Drizzle: schema-sync ===
2026-05-10T11:59:59.9901837Z >>> pnpm lint:schema-sync
2026-05-10T12:00:00.2947144Z 
2026-05-10T12:00:00.2948061Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-10T12:00:00.2951477Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-10T12:00:00.2954290Z 
2026-05-10T12:00:00.3360912Z OK
2026-05-10T12:00:00.3539252Z 
2026-05-10T12:00:00.3539971Z === Drizzle: source-comments ===
2026-05-10T12:00:00.3540715Z >>> pnpm lint:source-comments
2026-05-10T12:00:00.6606839Z 
2026-05-10T12:00:00.6607864Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-10T12:00:00.6608960Z > pnpm -C packages/db run lint:source-comments
2026-05-10T12:00:00.6609509Z 
2026-05-10T12:00:00.9919542Z 
2026-05-10T12:00:00.9920671Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-10T12:00:00.9921816Z > node scripts/check-source-comments.mjs
2026-05-10T12:00:00.9922395Z 
2026-05-10T12:00:01.0244186Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-10T12:00:01.0451092Z 
2026-05-10T12:00:01.0451708Z === Workspace: test ===
2026-05-10T12:00:01.0452292Z >>> pnpm -r test
2026-05-10T12:00:01.3584451Z Scope: 5 of 6 workspace projects
2026-05-10T12:00:01.3640856Z packages/db test$ vitest run
2026-05-10T12:00:01.3649091Z packages/game-logic test$ vitest run
2026-05-10T12:00:01.8862169Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-10T12:00:01.8880879Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-10T12:00:02.2866193Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T12:00:02.5155209Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-10T12:00:02.7720316Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:00:02.9064925Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T12:00:03.0225932Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:00:03.0283316Z packages/game-logic test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T12:00:03.0312450Z packages/game-logic test: [2m      Tests [22m [1m[32m21 passed[39m[22m[90m (21)[39m
2026-05-10T12:00:03.0333966Z packages/game-logic test: [2m   Start at [22m 12:00:01
2026-05-10T12:00:03.0336323Z packages/game-logic test: [2m   Duration [22m 1.14s[2m (transform 161ms, setup 0ms, import 255ms, tests 51ms, environment 1ms)[22m
2026-05-10T12:00:03.0752973Z packages/game-logic test: Done
2026-05-10T12:00:03.0774535Z packages/protocol test$ vitest run
2026-05-10T12:00:03.1497118Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T12:00:03.5915838Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-10T12:00:04.0178502Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-10T12:00:04.0186449Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 27[2mms[22m[39m
2026-05-10T12:00:04.0255881Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-10T12:00:04.0279507Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-10T12:00:04.0314562Z packages/db test: [2m   Start at [22m 12:00:01
2026-05-10T12:00:04.0316953Z packages/db test: [2m   Duration [22m 2.13s[2m (transform 153ms, setup 0ms, import 1.47s, tests 31ms, environment 1ms)[22m
2026-05-10T12:00:04.0600041Z packages/db test: Done
2026-05-10T12:00:04.1950801Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:00:04.3614567Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:00:04.5326172Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T12:00:04.5376314Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T12:00:04.5385496Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-10T12:00:04.5390128Z packages/protocol test: [2m   Start at [22m 12:00:03
2026-05-10T12:00:04.5391978Z packages/protocol test: [2m   Duration [22m 936ms[2m (transform 143ms, setup 0ms, import 271ms, tests 43ms, environment 0ms)[22m
2026-05-10T12:00:04.5690651Z packages/protocol test: Done
2026-05-10T12:00:04.5696361Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-10T12:00:04.5704593Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-10T12:00:05.0923292Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-10T12:00:05.1941348Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-10T12:00:06.2189158Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 61[2mms[22m[39m
2026-05-10T12:00:06.5630530Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T12:00:06.7726354Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-10T12:00:06.7730251Z apps/client test: [22m[39mroom_layout signature did not verify — rendering skipped for mvp-lobby 000
2026-05-10T12:00:06.7909145Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 146[2mms[22m[39m
2026-05-10T12:00:06.9152623Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-10T12:00:07.2001866Z apps/server test: {"level":40,"time":1778414407198,"pid":3233,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:00:07.2074568Z apps/server test: {"level":40,"time":1778414407201,"pid":3233,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:00:07.2105109Z apps/server test: {"level":40,"time":1778414407202,"pid":3233,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:00:07.2135356Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-10T12:00:07.9441563Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-10T12:00:08.1445670Z apps/server test: {"level":30,"time":1778414408140,"pid":3257,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-10T12:00:08.1475585Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 706[2mms[22m[39m
2026-05-10T12:00:08.1495094Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 580[2mms[22m[39m
2026-05-10T12:00:09.1639380Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-10T12:00:09.1831569Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-10T12:00:09.1843892Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-cIuYZ2/rebno.db
2026-05-10T12:00:09.1845511Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:00:09.1846886Z apps/server test: [run-migrations] OK
2026-05-10T12:00:09.1957108Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-10T12:00:09.1984757Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-oUgxvU/rebno.db
2026-05-10T12:00:09.2004479Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:00:09.2025037Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-10T12:00:09.2026365Z apps/server test: [run-migrations] OK
2026-05-10T12:00:09.2065592Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T12:00:09.2067895Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-akiWpR/rebno.db
2026-05-10T12:00:09.2084746Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:00:09.2104249Z apps/server test: [run-migrations] OK
2026-05-10T12:00:09.2125773Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T12:00:09.2127952Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-akiWpR/rebno.db
2026-05-10T12:00:09.2144729Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:00:09.2171167Z apps/server test: [run-migrations] OK
2026-05-10T12:00:09.2191382Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 49[2mms[22m[39m
2026-05-10T12:00:09.5399901Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 38[2mms[22m[39m
2026-05-10T12:00:09.7912540Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:00:10.1005376Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 25[2mms[22m[39m
2026-05-10T12:00:10.3255481Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:00:10.3635663Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 110[2mms[22m[39m
2026-05-10T12:00:11.1209996Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-10T12:00:11.1227437Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ enable debugging { debug: true }
2026-05-10T12:00:11.1229619Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-10T12:00:11.6756359Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 122[2mms[22m[39m
2026-05-10T12:00:11.9299085Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:00:11.9392229Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-10T12:00:11.9434829Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-10T12:00:11.9474461Z apps/server test: [2m   Start at [22m 12:00:05
2026-05-10T12:00:11.9476315Z apps/server test: [2m   Duration [22m 6.82s[2m (transform 437ms, setup 0ms, import 3.43s, tests 954ms, environment 2ms)[22m
2026-05-10T12:00:11.9982586Z apps/server test: Done
2026-05-10T12:00:12.4585569Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-10T12:00:13.1952602Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 75[2mms[22m[39m
2026-05-10T12:00:13.8678270Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:00:14.5429954Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:00:15.2172733Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T12:00:15.8978245Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-10T12:00:16.5650823Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:00:17.2332334Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:00:17.9298124Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:00:18.6166175Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:00:19.2897425Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T12:00:19.3105091Z apps/client test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-10T12:00:19.3115018Z apps/client test: [2m      Tests [22m [1m[32m98 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (102)[39m
2026-05-10T12:00:19.3125711Z apps/client test: [2m   Start at [22m 12:00:05
2026-05-10T12:00:19.3127529Z apps/client test: [2m   Duration [22m 14.12s[2m (transform 520ms, setup 42ms, collect 810ms, tests 573ms, environment 8.18s, prepare 1.70s)[22m
2026-05-10T12:00:19.4431619Z apps/client test: Done
2026-05-10T12:00:19.4511296Z 
2026-05-10T12:00:19.4511764Z verify-phase-4: OK (12 steps green)
